package com.langsin.shixu;

import com.langsin.bean.OrderDetail;
import com.langsin.bean.Orders;
import com.langsin.bean.User;
import com.langsin.shixu.mapper.OrdersMapper;
import com.langsin.shixu.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.InputStream;

public class ShiXuTest2 {

    SqlSession sqlSession = null;

    @Before  //每次测试之前执行 test方法执行之前
    public void textBefore() throws Exception {
        //读取mybatis配置文件
        InputStream stream = Resources.getResourceAsStream("mybatis.xml");
        //创建(建立工厂)对象
        SqlSessionFactoryBuilder build = new SqlSessionFactoryBuilder();
        //创建stream工厂
        SqlSessionFactory factory = build.build(stream);
        //创建一个会话，默认不自动提交  使用会话查询结果
        sqlSession = factory.openSession();

    }


    // 一对一 ，一对多 ,多对对 关联查询 （例如：一个用户有多个订单） 测试
    @Test
    public void textMapperGoods_OneAndMoreRelation() throws Exception {

        //获得mapper 接口 动态代理 的 实现类
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.queryUserOrders(702);
        System.out.println(user);

    }


    // 一对一关联查询 （例如：一个订单 对应 一个用户） 测试
    @Test
    public void textMapperGoods_OneAndOneRelation() throws Exception {

        //获得mapper 接口 动态代理 的 实现类
        OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
        Orders orders = ordersMapper.queryOrdersAndUserByOrdersId(1001);
        System.out.println(orders);

    }


    //  多层关联查询
    // 查询某个id的用户, 并查询出 他 下的所有订单 , 订单里的所有详情, 详情里的所有商品信息
    @Test
    public void textMapperUser_MoreRelation() throws Exception {

        //获得mapper 接口 动态代理 的 实现类
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.queryUserGoods(701);
        System.out.println("用户所有信息 = " + user);

        for (Orders orders : user.getOrdersList()) {
            System.out.println("订单信息 = " + orders);

            for (OrderDetail orderDetail : orders.getOrderDetailList()) {
                System.out.println("订单详情 = " + orderDetail);
                System.out.println("商品信息 = " + orderDetail.getGoods());
            }
        }

    }

    //  多层关联查询
    //  延迟加载
    //  懒加载
    @Test
    public void textMapperUser_MoreRelation_LazyLoading() throws Exception {

        //获得mapper 接口 动态代理 的 实现类
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.queryUserGoods(701);
        System.out.println("用户所有信息 = " + user);

        Thread.sleep(2000);

        for (Orders orders : user.getOrdersList()) {
            System.out.println("订单信息 = " + orders);

            Thread.sleep(2000);

            for (OrderDetail orderDetail : orders.getOrderDetailList()) {

                System.out.println("订单详情 = " + orderDetail);

                Thread.sleep(2000);

                System.out.println("商品信息 = " + orderDetail.getGoods());
            }
        }

    }


    //  延迟加载
    //  懒加载
    @Test
    public void textMapperOrders_LazyLoading() throws Exception {

        //获得mapper 接口 动态代理 的 实现类
        OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
        Orders orders = ordersMapper.queryOrdersAndUserByOrdersId(1001);
        System.out.println(orders);  //先获取 主表信息

        Thread.sleep(5000); //休眠 5 秒

        //休眠后  获取从表信息(user)
        System.out.println("从表信息——订单者 " + orders.getUser());

    }


    @After  //每次测试之后执行 test方法执行之后
    public void textAfter() throws Exception {

        sqlSession.commit(); //提交(主要用于修改是提交数据库)
        sqlSession.close(); //关闭

    }
}
